/********************************************************************* * * Copyright (C) 2003 Andrew Khan * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA ***************************************************************************/ package jxl.biff.drawing; import java.io.IOException; import jxl.common.Assert; import jxl.common.Logger; import jxl.biff.IntegerHelper; /** * The data for this blip store entry. Typically this is the raw image data */ class BlipStoreEntry extends EscherAtom { /** * The logger */ private static Logger logger = Logger.getLogger(BlipStoreEntry.class); /** * The type of the blip */ private BlipType type; /** * The image data read in */ private byte[] data; /** * The length of the image data */ private int imageDataLength; /** * The reference count on this blip */ private int referenceCount; /** * Flag to indicate that this entry was specified by the API, and not * read in */ private boolean write; /** * The start of the image data within this blip entry */ private static final int IMAGE_DATA_OFFSET = 61; /** * Constructor * * @param erd the escher record data */ public BlipStoreEntry(EscherRecordData erd) { super(erd); type = BlipType.getType(getInstance()); write = false; byte[] bytes = getBytes(); referenceCount = IntegerHelper.getInt(bytes[24], bytes[25], bytes[26], bytes[27]); } /** * Constructor * * @param d the drawing * @exception IOException */ public BlipStoreEntry(Drawing d) throws IOException { super(EscherRecordType.BSE); type = BlipType.PNG; setVersion(2); setInstance(type.getValue()); byte[] imageData = d.getImageBytes(); imageDataLength = imageData.length; data = new byte[imageDataLength + IMAGE_DATA_OFFSET]; System.arraycopy(imageData, 0, data, IMAGE_DATA_OFFSET, imageDataLength); referenceCount = d.getReferenceCount(); write = true; } /** * Accessor for the blip type * * @return the blip type */ public BlipType getBlipType() { return type; } /** * Gets the data for this blip so that it can be written out * * @return the data for the blip */ public byte[] getData() { if (write) { // Drawing has been specified by API // Type on win32 data[0] = (byte) type.getValue(); // Type on MacOs data[1] = (byte) type.getValue(); // The blip identifier // IntegerHelper.getTwoBytes(0xfce1, data, 2); // Unused tags - 18 bytes // System.arraycopy(stuff, 0, data, 2, stuff.length); // The size of the file IntegerHelper.getFourBytes(imageDataLength + 8 + 17, data, 20); // The reference count on the blip IntegerHelper.getFourBytes(referenceCount, data, 24); // Offset in the delay stream IntegerHelper.getFourBytes(0, data, 28); // Usage byte data[32] = (byte) 0; // Length of the blip name data[33] = (byte) 0; // Last two bytes unused data[34] = (byte) 0x7e; data[35] = (byte) 0x01; // The blip itself data[36] = (byte) 0; data[37] = (byte) 0x6e; // The blip identifier IntegerHelper.getTwoBytes(0xf01e, data, 38); // The length of the blip. This is the length of the image file plus // 16 bytes IntegerHelper.getFourBytes(imageDataLength + 17, data, 40); // Unknown stuff // System.arraycopy(stuff, 0, data, 44, stuff.length); } else { // drawing has been read in data = getBytes(); } return setHeaderData(data); } /** * Reduces the reference count in this blip. Called when a drawing is * removed */ void dereference() { referenceCount--; Assert.verify(referenceCount >= 0); } /** * Accessor for the reference count on the blip * * @return the reference count on the blip */ int getReferenceCount() { return referenceCount; } /** * Accessor for the image data. * * @return the image data */ byte[] getImageData() { byte[] allData = getBytes(); byte[] imageData = new byte[allData.length - IMAGE_DATA_OFFSET]; System.arraycopy(allData, IMAGE_DATA_OFFSET, imageData, 0, imageData.length); return imageData; } }